package au.com.acpfg.xml.reader;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import org.knime.core.data.DataCell;
import org.knime.core.data.DataColumnSpec;
import org.knime.core.data.DataColumnSpecCreator;
import org.knime.core.data.DataRow;
import org.knime.core.data.DataTableSpec;
import org.knime.core.data.DataType;
import org.knime.core.data.RowKey;
import org.knime.core.data.def.DefaultRow;
import org.knime.core.data.def.DoubleCell;
import org.knime.core.data.def.IntCell;
import org.knime.core.data.def.StringCell;
import org.knime.core.node.BufferedDataContainer;
import org.knime.core.node.BufferedDataTable;
import org.knime.core.node.CanceledExecutionException;
import org.knime.core.node.defaultnodesettings.SettingsModelBoolean;
import org.knime.core.node.defaultnodesettings.SettingsModelIntegerBounded;
import org.knime.core.node.defaultnodesettings.SettingsModelString;
import org.knime.core.node.ExecutionContext;
import org.knime.core.node.ExecutionMonitor;
import org.knime.core.node.InvalidSettingsException;
import org.knime.core.node.NodeLogger;
import org.knime.core.node.NodeModel;
import org.knime.core.node.NodeSettingsRO;
import org.knime.core.node.NodeSettingsWO;
/**
* This is the model implementation of XMLReader.
* Loads XML documents (either in a folder or files) into XML cells for further processing by the XQuery Processor node
*
* @author Andrew Cassin
*/
public class XMLReaderNodeModel extends NodeModel {
// the logger instance
private static final NodeLogger logger = NodeLogger
.getLogger(XMLReaderNodeModel.class);
// configuration keys used by the dialog class
static final String CFGKEY_FILE = "filename";
static final String CFGKEY_FOLDER = "folder";
static final String CFGKEY_LOAD_FOLDER = "load-folder?";
static final String CFGKEY_SINGLE_NS = "single-namespace";
// defaults for persistent state
private static final String DEFAULT_FILE = "c:/temp/foo.xml";
private static final String DEFAULT_FOLDER = "c:/temp";
// persistent state
private final SettingsModelString m_filename = new SettingsModelString(CFGKEY_FILE, DEFAULT_FILE);
private final SettingsModelString m_folder = new SettingsModelString(CFGKEY_FOLDER, DEFAULT_FOLDER);
private final SettingsModelBoolean m_load_folder = new SettingsModelBoolean(CFGKEY_LOAD_FOLDER, false);
private final SettingsModelBoolean m_ns = new SettingsModelBoolean(CFGKEY_SINGLE_NS, true);
/**
* Constructor for the node model.
*/
protected XMLReaderNodeModel() {
super(0, 1);
m_filename.setEnabled(true); // must match defaults for the fields
m_folder.setEnabled(false);
}
/**
* {@inheritDoc}
*/
@Override
protected BufferedDataTable[] execute(final BufferedDataTable[] inData,
final ExecutionContext exec) throws Exception {
/* ensure namespaces are not required in XQueries if requested by user */
if (m_ns.getBooleanValue()) {
}
/* setup list of files as requested by user */
File[] files;
if (m_load_folder.getBooleanValue()) {
File folder = new File(m_folder.getStringValue());
files = folder.listFiles(new FileFilter() {
@Override
public boolean accept(File arg0) {
return (arg0.isFile() && arg0.getAbsolutePath().toLowerCase().endsWith("xml"));
}
});
} else {
files = new File[] { new File(m_filename.getStringValue()) };
}
logger.info("Found "+files.length+" plausible XML files to process.");
// create output container
DataColumnSpec[] cols = new DataColumnSpec[2];
cols[0] = new DataColumnSpecCreator("XML Filename", StringCell.TYPE).createSpec();
cols[1] = new DataColumnSpecCreator("XML Data", XMLCell.TYPE).createSpec();
DataTableSpec out = new DataTableSpec(cols);
BufferedDataContainer container = exec.createDataContainer(out, true);
// load XML
int done = 0;
for (File f : files) {
DataCell[] cells = new DataCell[2];
cells[0] = new StringCell(f.getAbsolutePath());
XMLCell xc = new XMLCell(f);
cells[1] = xc;
container.addRowToTable(new DefaultRow("File"+done++, cells));
exec.checkCanceled();
exec.setProgress(((double)++done) / files.length);
}
container.close();
return new BufferedDataTable[] { container.getTable() };
}
/**
* {@inheritDoc}
*/
@Override
protected void reset() {
}
/**
* {@inheritDoc}
*/
@Override
protected DataTableSpec[] configure(final DataTableSpec[] inSpecs)
throws InvalidSettingsException {
DataColumnSpec[] cols = new DataColumnSpec[2];
cols[0] = new DataColumnSpecCreator("XML Filename", StringCell.TYPE).createSpec();
cols[1] = new DataColumnSpecCreator("XML Data", XMLCell.TYPE).createSpec();
return new DataTableSpec[]{new DataTableSpec(cols)};
}
/**
* {@inheritDoc}
*/
@Override
protected void saveSettingsTo(final NodeSettingsWO settings) {
m_filename.saveSettingsTo(settings);
m_folder.saveSettingsTo(settings);
m_load_folder.saveSettingsTo(settings);
m_ns.saveSettingsTo(settings);
}
/**
* {@inheritDoc}
*/
@Override
protected void loadValidatedSettingsFrom(final NodeSettingsRO settings)
throws InvalidSettingsException {
m_filename.loadSettingsFrom(settings);
m_folder.loadSettingsFrom(settings);
m_load_folder.loadSettingsFrom(settings);
m_ns.loadSettingsFrom(settings);
}
/**
* {@inheritDoc}
*/
@Override
protected void validateSettings(final NodeSettingsRO settings)
throws InvalidSettingsException {
m_filename.validateSettings(settings);
m_folder.validateSettings(settings);
m_load_folder.validateSettings(settings);
m_ns.validateSettings(settings);
}
/**
* {@inheritDoc}
*/
@Override
protected void loadInternals(final File internDir,
final ExecutionMonitor exec) throws IOException,
CanceledExecutionException {
}
/**
* {@inheritDoc}
*/
@Override
protected void saveInternals(final File internDir,
final ExecutionMonitor exec) throws IOException,
CanceledExecutionException {
}
}